package cl.vixionarios.biotika.dao.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.jboss.logging.Logger;

import cl.vixionarios.biotika.dao.DBBase;
import cl.vixionarios.biotika.dao.interfaces.IFarmacia;
import cl.vixionarios.biotika.dao.to.FarmaciaTO;

public class FarmaciaDB extends DBBase implements IFarmacia {
	
	private Logger logger = Logger.getLogger(getClass().getCanonicalName());
	
	public FarmaciaDB(Connection c){
		
		conn = c;
	}
	
	public List<FarmaciaTO> obtenerFarmaciasCercanas(String latitudActual,
			String longitudActual) {
		
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		Double latitudDouble = Double.parseDouble(latitudActual);
		Double longitudDouble = Double.parseDouble(longitudActual);
		
		String query = 	" SELECT nombre, region, comuna,  direccion, horario, dia, mes, " +
				       	" latitud, longitud FROM (" +
					    "   select (1.852 * 60 * degrees(ACOS ( SIN( radians(?) ) * SIN( radians(latitud::numeric) ) + COS( radians(?) ) * COS( radians(latitud::numeric) ) * COS( radians(longitud::numeric - ?) )))) as distancia" +
					    " ,nombre, region, comuna, dia, mes, direccion, horario," +
				       	" latitud, longitud" +
						" from farmacia" + 
						" ) T" +
						" WHERE T.distancia < 10 AND dia = ? AND mes = ? " +
						" ";
		
		List<FarmaciaTO> farmaciasCercanas = new ArrayList<FarmaciaTO>();
		
		try{
			
			Calendar c = Calendar.getInstance();
			
			pstmt = conn.prepareStatement(query);
			pstmt.setDouble(1, latitudDouble);
			pstmt.setDouble(2, latitudDouble);
			pstmt.setDouble(3, longitudDouble);
			pstmt.setDouble(4, c.get(Calendar.DAY_OF_MONTH));
			pstmt.setDouble(5, c.get(Calendar.MONTH));
			
			rs = pstmt.executeQuery();
			
			while(rs.next()){
				
				FarmaciaTO farmacia = new FarmaciaTO();
				

				farmacia.setNombre(rs.getString("nombre"));
				farmacia.setRegion(rs.getString("region"));
				farmacia.setComuna(rs.getString("comuna"));
				farmacia.setDireccion(rs.getString("direccion"));
				farmacia.setDia(rs.getInt("dia"));
				farmacia.setMes(rs.getInt("mes"));
				farmacia.setHorario(rs.getString("horario"));
				farmacia.setLatitud(rs.getString("latitud"));
				farmacia.setLongitud(rs.getString("longitud"));
				
				farmaciasCercanas.add(farmacia);
			}
		}
		catch(SQLException ex)
		{
			logger.error(ex);
		}
		catch (Exception ex) 
		{
			logger.error(ex);
		}
		finally{
			if(pstmt!=null){
				try{
					pstmt.close();
					rs.close();
				}
				catch(SQLException ex){
					logger.error("[" + this.getClass().getCanonicalName() + "] [obtenerFarmaciasCercanas][" + ex.getMessage() + "]");
				}
			}
		}
		return farmaciasCercanas;
	}
}
